package socket;

import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
import java.util.concurrent.ExecutorService;

public class Server {
    private ServerSocket serverSocket;

    public Server(){
        /**
         * java.net.ServerSocket
         * 运行在服务端的ServerSocket有两个操作
         * 1:向系统申请服务端口，客户端就是通过这个端口与服务端建立链接的
         * 2:监听该端口，一旦一个客户端链接该端口，就创建一个Socket对象，与之进行通讯。
         */
        try{
            System.out.println("正在启动服务器...");
            serverSocket = new ServerSocket(8088);
            System.out.println("服务器启动完毕！");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void start(){
        try{
            /*
               Socket accept()
               ServerSocket的accept方法用于监听服务端口，一旦一个客户端链接，那么会立即
               返回一个Socket对象，使用这个Socket对象与该客户端进行交互
               该方法是一个阻塞方法，调用后线程会阻塞，直到有客户端链接该服务端口。
             */
            System.out.println("等待客户端链接...");
            Socket socket = serverSocket.accept();
            System.out.println("一个客户端已链接！");
            /*
                Socket提供的方法:
                InputStream getInputstream()
                通过Socket获取的字节输入流可以读取对方发送过来的字节
             */
            InputStream in = socket.getInputStream();
            /*

             */
//            int d = in.read();
//            System.out.println(d);
            /*  //1先读取1个字节，得知字符串长度
            int len = in.read();
            //2 基于长度创建字节数组
            byte[] data = new byte[len];
            //3 读取字节数组
            in.read(data);

            String massage = new String(data, StandardCharsets.UTF_8);
            System.out.println("客户端说：" + massage);
             */

            int len;
            while ((len = in.read()) != -1) {
                byte[] data = new byte[len];
                in.read(data);

                String massage = new String(data, StandardCharsets.UTF_8);
                System.out.println("客户端说：" + massage);
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        Server server = new Server();
        server.start();
    }

}

